package com.bjsxt;

import java.util.ArrayList;
import java.util.List;

/**
 * 聚合类, 管理迭代，并可以返回一个迭代器对象
 * 	ConcreteMyAggregate和ConcreteIterator将管理对象集合和遍历对象集合的职责分开
 * 
 * @author Melo
 *
 */
public class ConcreteMyAggregate {

	private List<Object> list = new ArrayList<Object>();

	public void addObject(Object obj) {
		this.list.add(obj);
	}

	public void removeObject(Object obj) {
		this.list.remove(obj);
	}

	public List<Object> getList() {
		return list;
	}

	public void setList(List<Object> list) {
		this.list = list;
	}

	/**
	 * 获得迭代器
	 *
	 * @return 迭代器
	 */
	public MyIterator createIterator() {
		return new ConcreteIterator();
	}

	/**
	 * 统一的迭代器实现类
	 * 	使用内部类定义迭代器，可以直接使用外部类的属性
	 * 
	 * @author Melo
	 *
	 */
	private class ConcreteIterator implements MyIterator {

		private int cursor; // 定义游标用于记录遍历时的位置

		@Override
		public void first() {
			cursor = 0;
		}

		@Override
		public Object getCurrentObj() {
			return list.get(cursor);
		}

		@Override
		public boolean hasNext() {
			return cursor < list.size();
		}

		@Override
		public boolean isFirst() {
			return cursor == 0;
		}

		@Override
		public boolean isLast() {
			return cursor == (list.size() - 1);
		}

		@Override
		public void next() {
			if (cursor < list.size()) {
				cursor++;
			}
		}

	}

}
